package com.proyecto.core.vista.echo.componentes;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.table.DefaultTableModel;

import com.proyecto.core.Utilidades.UtilConversion;

import echopointng.TableEx;
import echopointng.table.TableActionEventEx;

public class GestionTablas{

	private ArrayList campos = new ArrayList();

	private ArrayList titulos = new ArrayList();

	private TableEx tableEx = new TableEx();

	private HashMap hm;

	private String campoClave;

	private int columnaCampoClave;
	
	private String metodoClaveCompuesta;
	
	private int filaSeleccionada = -1;
	
	public GestionTablas(String atributoClaveCompuesta){
		
		if (atributoClaveCompuesta!=null){
			metodoClaveCompuesta = "get" + UtilConversion.inicialMayuscula(atributoClaveCompuesta);
		}
	}

	public TableEx generarTabla(String[] titulos, ArrayList lista) {
		int i = titulos.length;
		int j = lista.size();
		DefaultTableModel dtm = new DefaultTableModel(i, j);
		
		for (int k = 0; k < titulos.length; k++) {
			dtm.setColumnName(k, titulos[k]);
		}
		for (int k = 0; k < lista.size(); k++) {
			dtm.addRow((Object[]) lista.get(k));
			
		}
		tableEx = new TableEx(dtm);
		
		tableEx.setSelectionEnabled(true);
		
		return tableEx;
	}

	public TableEx generarTabla(List lista) {

		DefaultTableModel dtm = new DefaultTableModel(this.getTitulos().size(),lista.size());
		
		ArrayList al = new ArrayList();
		try {
			al = this.ProcesarLista(lista);
		} catch (Exception e) {
			e.printStackTrace();
		}
		for (int k = 0; k < this.getTitulos().size(); k++) {
			dtm.setColumnName(k, (String) this.getTitulos().get(k));
		}
		for (int k = 0; k < lista.size(); k++) {
			dtm.addRow((Object[]) al.get(k));
		}
	
		tableEx = new TableEx(dtm);
		tableEx.setSelectionEnabled(true);
		return tableEx;
	}
	
	public TableEx generarTabla() {
		DefaultTableModel dtm = new DefaultTableModel(this.getTitulos().size(),1);
		for (int k = 0; k < this.getTitulos().size(); k++) {
			dtm.setColumnName(k, (String) this.getTitulos().get(k));
		}
		tableEx = new TableEx(dtm);
		tableEx.setSelectionEnabled(true);
		return tableEx;
	}

	public void cargarTabla(List lista) {
		DefaultTableModel dtm = (DefaultTableModel) tableEx.getModel();
		dtm = new DefaultTableModel(this.getTitulos().size(),1);
		for (int k = 0; k < this.getTitulos().size(); k++) {
			dtm.setColumnName(k, (String) this.getTitulos().get(k));
		}
		ArrayList al = new ArrayList();
		try {
			al = this.ProcesarLista(lista);
		} catch (Exception e) {
			e.printStackTrace();
		}
		for (int k = 0; k < lista.size(); k++) {
			dtm.insertRow(k,(Object[]) al.get(k));
		}
		tableEx.setModel(dtm);
		if ((al.size() == 0) || 
			(filaSeleccionada + 1> al.size())){
			filaSeleccionada = -1;
		} else {
			if (filaSeleccionada>=0)
			    tableEx.getSelectionModel().setSelectedIndex(filaSeleccionada, true);
		}
	}
	
	public void cargarTab(List lista) {
		DefaultTableModel dtm = (DefaultTableModel) tableEx.getModel();
		dtm = new DefaultTableModel(this.getTitulos().size(),1);
		for (int k = 0; k < this.getTitulos().size(); k++) {
			dtm.setColumnName(k, (String) this.getTitulos().get(k));
		}
		ArrayList al = new ArrayList();
		try {
			al = this.ProcesarLista(lista);
		} catch (Exception e) {
			e.printStackTrace();
		}
		for (int k = 0; k < lista.size(); k++) {
			dtm.insertRow(k,(Object[]) al.get(k));
			
		}
		tableEx.setModel(dtm);
		if ((al.size() == 0) || 
			(filaSeleccionada + 1> al.size())){
			filaSeleccionada = -1;
		} else {
			if (filaSeleccionada>=0)
			    tableEx.getSelectionModel().setSelectedIndex(filaSeleccionada, true);
		}
	}
	
	public void limpiarTabla() {

		DefaultTableModel dtm = (DefaultTableModel) tableEx.getModel();
		System.out.println(" cuenta: " + dtm.getRowCount());
		for (int k = 0; k < dtm.getRowCount(); k++) {
			dtm.deleteRow(k);
		}
		tableEx.setModel(dtm);
	}

	
	public ArrayList ProcesarLista(List lista) throws Exception {
		hm = new HashMap();
		ArrayList objetos = new ArrayList();
		int rows = lista.size();
		for (int i = 0; i < rows; i++) {
			Object obj = lista.get(i);
			List a = new ArrayList();
			for (int j = 0; j < campos.size(); j++) {
				Method metodo = obj.getClass().getDeclaredMethod((String) campos.get(j));
				Object valor;
				if ((this.metodoClaveCompuesta!=null) && 
				    ("getId".equals((String) campos.get(j)))){
						Object objId = metodo.invoke(obj);
						metodo = objId.getClass().getDeclaredMethod(this.metodoClaveCompuesta);
						valor = metodo.invoke(objId);
					} else {
						valor = metodo.invoke(obj);
					}
				if (valor != null) {
					a.add(valor);	
				}else{
					a.add("");
				}
				if (campos.get(j).toString().equalsIgnoreCase(this.getCampoClave())) {
					 if (valor instanceof Integer) {
							valor = valor.toString();
					 }
					hm.put(valor, obj);
					columnaCampoClave = j;
				}
			}
			objetos.add(a.toArray());
		}
		return objetos;
	}
	 //Falta hacer que se seleccione la fila de la tabla en caso de que el pojo que estoy pasando como referencia este 
	//en la tabla
	public boolean SeleccionarEnTabla(Object obj){
		boolean bandera = false;
		try {
			Method metodo = obj.getClass().getDeclaredMethod("getId");
			String o = metodo.invoke(obj).toString();
			if(hm.get(o).equals(obj)){
				bandera = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bandera;
	}	


	public Object ManejaEvento(ActionEvent e) {
		TableActionEventEx tex = (TableActionEventEx) e;
		filaSeleccionada = tex.getRow(); 
		TableEx ex = (TableEx) e.getSource();
		DefaultTableModel model = (DefaultTableModel) ex.getModel();
		
		String cc = model.getValueAt(this.getColumnaCampoClave(), tex.getRow()).toString();
			
		return hm.get(cc);
	}
	
	public Object obtenerFilaActual(){
		Object fila = null;

		if (filaSeleccionada >= 0){
			DefaultTableModel model = (DefaultTableModel) tableEx.getModel();
			String cc = model.getValueAt(this.getColumnaCampoClave(), filaSeleccionada).toString();
			fila = hm.get(cc);
		}
		return fila;
	}
	
	public void incluirCampo(String titulo, String atributo) {
		String metodo = "get" + UtilConversion.inicialMayuscula(atributo);
		campos.add(metodo);
		titulos.add(titulo);
	}
    
	final public int getFilaSeleccionada(){
		return filaSeleccionada;
	}
	
	public ArrayList getCampos() {
		return campos;
	}

	public void setCampos(ArrayList campos) {
		this.campos = campos;
	}

	public ArrayList getTitulos() {
		return titulos;
	}

	public void setTitulos(ArrayList titulos) {
		this.titulos = titulos;
	}

	public String getCampoClave() {
		return campoClave;
	}

	public void setCampoClave(String atributo) {
		String metodo = "get" + UtilConversion.inicialMayuscula(atributo);
		this.campoClave = metodo;
	}

	public int getColumnaCampoClave() {
		return columnaCampoClave;
	}

	public void setColumnaCampoClave(int columnaCampoClave) {
		this.columnaCampoClave = columnaCampoClave;
	}


}
